/*-
 * Copyright (c) 2006 - 2010 CTPP Team
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 4. Neither the name of the CTPP Team nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *      m_ctpp.cpp
 *
 * $CTPP$
 */

#include "m_ctpp.hpp"

// C Includes
extern "C"
{
    #include "Zend/zend_errors.h"
    #include "php.h"
}

namespace M_CTPP // C++ Template Engine
{
// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Struct CTPPError
//

//
// Constructor
//
CTPPError::CTPPError(const STLW::string  & sTemplateName,
                     const STLW::string  & sErrorDescr,
                     const UINT_32         iErrrorCode,
                     const UINT_32         iLine,
                     const UINT_32         iPos,
                     const UINT_32         iIP): template_name(sTemplateName),
                                                 error_descr(sErrorDescr),
                                                 error_code(iErrrorCode),
                                                 line(iLine),
                                                 pos(iPos),
                                                 ip(iIP)
{
	;;
}

// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Class PHPOutputCollector
//

//
// A destructor
//
PHPOutputCollector::~PHPOutputCollector() throw()
{
	;;
}

//
// Collect data
//
INT_32 PHPOutputCollector::Collect(const void    * vData,
                                   const UINT_32   iDataLength)
{
	TSRMLS_FETCH();
	php_write((void *)vData, iDataLength TSRMLS_CC);

return 0;
}

// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Class PHPLogger
//

//
// A destructor
//
PHPLogger::~PHPLogger() throw()
{
	;;
}

//
// Write message to log file
//
INT_32 PHPLogger::WriteLog(const UINT_32  iPriority,
                           CCHAR_P        szString,
                           const UINT_32  iStringLen)
{
	TSRMLS_FETCH();

	INT_32 iPHPPriority = E_ERROR;
	switch (iPriority)
	{
		case CTPP2_LOG_EMERG:
		case CTPP2_LOG_ALERT:
		case CTPP2_LOG_CRIT:
		case CTPP2_LOG_ERR:
			iPHPPriority = E_ERROR;
			break;

		case CTPP2_LOG_WARNING:
			iPHPPriority = E_WARNING;
			break;

		case CTPP2_LOG_NOTICE:
		case CTPP2_LOG_INFO:
		case CTPP2_LOG_DEBUG:
			iPHPPriority = E_NOTICE;
			break;

		default:
			;;
	}

	php_error(iPHPPriority, "%s(): %.*s", get_active_function_name(TSRMLS_C), iStringLen, szString);

return 0;
}

} // namespace M_CTPP
// End.
